/*
 * FileName: PrintInvokedMethods.java
 * Author:   zzw
 * Date:     2018年11月19日
 * Description:
 */
package com.zzw.hotspot.sa;

import sun.jvm.hotspot.memory.*;
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.runtime.*;
import sun.jvm.hotspot.tools.*;
import sun.jvm.hotspot.utilities.*;

/**
 * 〈〉<br>
 * 〈〉
 *
 * @author zzw
 * @see [相关类/方法]（可选）
 * @since [产品/模块版本]（可选）
 */
public class PrintInvokedMethods extends Tool {

    @Override
    public void run() {
        final OopVisitor methodVisitor = new DefaultOopVisitor() {
            @Override
            public void doOop(OopField field, boolean isVMField) {
                /*Method method = (Method) field.getValue(getObj());*/
               /*
                if (method != null && (method.getInvocationCounter() >>> 2) > 0) {
                    System.out.println(method.externalNameAndSignature());
                }*/
            }
        };

        final SystemDictionary.ClassVisitor classVisitor = new SystemDictionary.ClassVisitor() {
            @Override
            public void visit(Klass k) {
                if (k instanceof InstanceKlass) {
                    InstanceKlass ik = (InstanceKlass) k;
                    MethodArray methods = ik.getMethods();
                    //methods.iterate(methodVisitor, false);
                }
            }
        };

        VM.getVM().getSystemDictionary().classesDo(classVisitor);
    }

    @Override
    public String getName() {
        return "printInvokedMethods";
    }

    public static void main(String[] args) {
        PrintInvokedMethods tool = new PrintInvokedMethods();
        tool.start(args);
        tool.stop();
    }
}
